home *** CD-ROM | disk | FTP | other *** search
/ Aminet 33 / Aminet 33 - October 1999.iso / Aminet / dev / gui / ClassFree_src.lha / ClassFree_src / CFfuelgiclass / class.c < prev    next >
Encoding:
C/C++ Source or Header  |  1999-01-26  |  3.7 KB  |  156 lines

  1. /* Sample class  for StormC*/
  2.  
  3. #include <clib/alib_protos.h>
  4. #include <proto/graphics.h>
  5. #include <proto/intuition.h>
  6. #include <proto/utility.h>
  7. #include <exec/libraries.h>
  8. #include <intuition/classes.h>
  9. #include <intuition/imageclass.h>
  10. #include <dos/dos.h>
  11. #include "class.h"
  12. #include "CFfuelgi.h"
  13. #include "CFtexti.h"
  14. #ifdef DEBUG
  15.  #include "debug_protos.h"
  16.  extern APTR console;
  17. #endif
  18.  
  19. Class *initclass(struct classbase *base)
  20. {
  21.   Class *cl;
  22.  
  23.   if(cl = MakeClass(CFfuelgiClassName,FRAMEICLASS,NULL,
  24.         sizeof(struct objectdata),NULL))
  25.   {
  26.     cl->cl_Dispatcher.h_Entry = hookEntry;
  27.     cl->cl_Dispatcher.h_SubEntry = dispatcher;
  28.     AddClass(cl);
  29.   }
  30.   base->cl = cl;
  31.  
  32.   return(cl);
  33. }
  34.  
  35. BOOL removeclass(struct classbase *base)
  36. {
  37.   BOOL result;
  38.  
  39.   if(result = FreeClass(base->cl)) base->cl = NULL;
  40.  
  41.   return(result);
  42. }
  43.  
  44. ULONG dispatcher(Class *cl,Object *o,Msg msg)
  45. {
  46.   switch(msg->MethodID)
  47.   {
  48.     case OM_NEW:
  49.       return(newobject(cl,o,msg));
  50.     case OM_DISPOSE:
  51.       return(dispose(cl,o));
  52.     case IM_DRAW:
  53.       return(draw(cl,o,msg));
  54.     default:
  55.       return(DoSuperMethodA(cl,o,msg));
  56.   }
  57. }
  58.  
  59. ULONG newobject(Class *cl,Object *o,Msg msg)
  60. {
  61.   ULONG newobj;
  62.   struct objectdata *dt;
  63.   struct TagItem *attrs = ((struct opSet *)msg)->ops_AttrList;
  64.   struct TagItem tag[6];
  65.   ULONG max,left,top,width,height;
  66.   char *label;
  67.   struct Image *fgim;
  68.  
  69. #ifdef DEBUG
  70.   DLprintf(console,"New object\n");
  71. #endif
  72.   /* Get class attributes */
  73.   max = GetTagData(CFFG_Max,1,attrs);
  74.   label = (char *)GetTagData(CFFG_Label,NULL,attrs);
  75.   left = GetTagData(IA_Left,0,attrs);
  76.   top = GetTagData(IA_Top,0,attrs);
  77.   width = GetTagData(IA_Width,10,attrs);
  78.   height = GetTagData(IA_Height,10,attrs);
  79.   /* Set suoerclass attrs */
  80.   tag[0].ti_Tag = IA_Left; tag[0].ti_Data = left;
  81.   tag[1].ti_Tag = IA_Top; tag[1].ti_Data = top;
  82.   tag[2].ti_Tag = IA_Width; tag[2].ti_Data = width;
  83.   tag[3].ti_Tag = IA_Height; tag[3].ti_Data = height;
  84.   tag[4].ti_Tag = IA_Recessed; tag[4].ti_Data = TRUE;
  85.   tag[5].ti_Tag = TAG_DONE;
  86.   ((struct opSet *)msg)->ops_AttrList = tag;
  87.  
  88.   if(newobj = DoSuperMethodA(cl,o,msg))
  89.   {
  90. #ifdef DEBUG
  91.   DLprintf(console,"New object created!\n");
  92. #endif
  93.     fgim = (struct Image *)newobj;
  94.     dt = (struct objectdata *)INST_DATA(cl,newobj);
  95.     dt->max = max;
  96.     dt->flags = FGF_NEW;
  97.     if(label)
  98.     {
  99.       dt->label = (struct Image *)NewObject(NULL,CFtextiClassName,
  100.                   IA_Left, fgim->LeftEdge,
  101.                   IA_Top, 0,
  102.                   IA_Width, fgim->Width,
  103.                   IA_Data, label,
  104.                   IA_FGPen, 1,
  105.                   CFTI_PosFlags, TIPOS_CENTER,
  106.                   CFTI_Redraw, FALSE,
  107.                   TAG_DONE);
  108.     }
  109.   }
  110.   return(newobj);
  111. }
  112.  
  113. ULONG dispose(Class *cl,Object *o)
  114. {
  115.   struct objectdata *dt = (struct objectdata *)INST_DATA(cl,o);
  116.  
  117.   if(dt->label) DisposeObject(dt->label);
  118.   return(DoSuperMethod(cl,o,OM_DISPOSE));
  119. }
  120.  
  121.  
  122. ULONG draw(Class *cl,Object *o,Msg msg)
  123. {
  124.   struct objectdata *dt = (struct objectdata *)INST_DATA(cl,o);
  125.   struct impDraw *draw = (struct impDraw *)msg;
  126.   struct RastPort *rp = draw->imp_RPort;
  127.   struct Image *fgim = (struct Image *)o;
  128.   struct opSet set;
  129.   struct TagItem tag[2];
  130.   ULONG fillw;
  131.  
  132.   if(dt->flags&FGF_NEW)
  133.   {
  134.     set.MethodID = OM_SET;
  135.     set.ops_AttrList = tag;
  136.     set.ops_GInfo = NULL;
  137.     tag[0].ti_Tag = IA_Top;
  138.     tag[0].ti_Data = fgim->TopEdge+fgim->Height/2-rp->TxHeight/2-1;
  139.     tag[1].ti_Tag = TAG_DONE;
  140.     DoMethodA((Object *)dt->label,(Msg)&set);
  141.     dt->flags &= ~FGF_NEW;
  142.   }
  143.   fillw = (draw->imp_State*fgim->Width)/dt->max;
  144.   if(fillw>fgim->Width-2) fillw = fgim->Width-2;
  145.   DoSuperMethodA(cl,o,msg);
  146.   SetAPen(rp,3);
  147.   RectFill(rp,fgim->LeftEdge+1,fgim->TopEdge+1,
  148.           fgim->LeftEdge+fillw, fgim->TopEdge+fgim->Height-2);
  149.   if(dt->label)
  150.   {
  151.     draw->imp_State = IDS_NORMAL;
  152.     DoMethodA((Object *)dt->label,msg);
  153.   }
  154.   return(0);
  155. }
  156.